#ifndef _MB_COM_H
#define _MB_COM_H

#include "mbdef.h"

/*****************************************************************************
* @brief   底层IO
*****************************************************************************/
void mb_package_send(mb_obj_type * mb_obj);			// 数据打包

uint8_t mb_data_send(mb_obj_type *mb_obj, void(*send)(uint8_t), uint8_t len); // 发送数据
void mb_data_rcv(mb_obj_type *mb_obj, uint8_t dat);	// 接收数据
void mb_send_end(mb_obj_type *mb_obj);				// 硬件发送结束调用

/*****************************************************************************
* @brief   计时器管理
*****************************************************************************/
void mb_rtu_timer_run(mb_obj_type *mb_obj);					//1ms中断中调用
// 使用硬件定时器时不调用这两个函数，有外部重新实现为硬件定时
void mb_timer_en(mb_obj_type *mb_obj);						//接收中断调用
void mb_timer_dis(mb_obj_type *mb_obj);

/*****************************************************************************
* @brief   基本设置
*****************************************************************************/
void mb_slave_id_set(mb_obj_type *mb_obj, uint8_t id);		// 设定从站号
void mb_timeout_set(mb_obj_type *mb_obj, uint16_t time);	// 设定超时时间
void mb_rtu_time_set(mb_obj_type *mb_obj, uint16_t time);	// 设定RTU结束时间
void mb_end_delay_set(mb_obj_type *mb_obj, uint16_t time);	// 设定主机延时时间

/* 初始化对象包含以下内容
	mb_obj->fun.slave.reg_coils_cb = &smb_default_CoilsCB;
	mb_obj->fun.slave.reg_discrete_cb = &smb_default_DiscreteCB;
	mb_obj->fun.slave.reg_hold_cb = &smb_default_HoldingCB;
	mb_obj->fun.slave.reg_input_cb = &smb_default_InputCB;
	//MASER FUNCTION INIT
	mmb_cmd_buff_init(mb_obj, mmb_cmd_buff, 16, 8);
	mb_obj->fun.master.err_cnt = 0;

	mb_obj->os_rtu_end_event = 0x01;
	mb_obj->os_timeout_event = 0x02;
	mb_obj->rtu_rcv_end_delay_set = 5;

	mb_obj->os_event_send = mb_default_os_send;
	mb_obj->adu_send = mb_default_DataSend;
	*/
void mb_obj_init(mb_obj_type *mb_obj); //主机指向一个内部命令列表，列表长16，静态动态各8

/*****************************************************************************
* @brief   扫描
*****************************************************************************/
void mb_poll(mb_obj_type *mb_obj);

/*****************************************************************************
* @brief   杂项
*****************************************************************************/
//长按执行一次的操作， check_val_now为被监控变量  plse提供计数脉冲
//超时释放计数值6     长按动作计数15
void  mb_gus_key_opt(mb_gus_keep_key_t *key, uint8_t check_val_now, uint8_t b_pulse);

#endif
